﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace DotNET4Study
{
    /*
     * 说明：类的静态字段在类的实例中是共享的。多个线程修改实例字段的值在对其它线程来说是可见的，这也是clr默认的行为。
     * 对静态字段添加ThreadStaticAttribute标记可以改变这种默认的行为。
     * ThreadStaticAttribute 指示静态字段的值对于每个线程都是唯一的。
     * 用 ThreadStaticAttribute 标记的 static 字段不在线程之间共享。
     * 每个执行线程都有单独的字段实例，并且独立地设置及获取该字段的值。
     * 如果在不同的线程中访问该字段，则该字段将包含不同的值。
     */
    public class ThreadStaticStudy
    {
        //定义亲缘字段的属性
        [System.ThreadStatic]
        //此静态字段被标记为亲缘字段
        static string str = "Initial value";
        static void DisplayStr()
        {
            Console.WriteLine("Thread#{0} Str={1}", Thread.CurrentThread.ManagedThreadId, str);
        }

        static void ThreadProc()
        {
            DisplayStr();
            str = "ThreadProc value";
            DisplayStr();
        }

        public static void Excute()
        {
            DisplayStr();
            //创建线程
            Thread thread = new Thread(ThreadProc);
            //线程开始
            thread.Start();
            //将主线程挂起，直到本身线程执行完毕
            thread.Join();
            DisplayStr();
            //将主线程挂起
        }
    }
}
